home *** CD-ROM | disk | FTP | other *** search
/ 100 Plus Great Games 2 / 100PLUSV2.BIN / games / WakeRace.dxr / Internal_3_Enemy Manager.ls < prev    next >
Encoding:
Text File  |  2002-01-25  |  8.8 KB  |  201 lines

  1. global gPlayer, gCurrTrack, gFinalRankings, geEnemyList, geDestPoints
  2.  
  3. on e_Init
  4.   geEnemyList = []
  5.   geDestPoints = [[point(993, 715), point(1057, 666), point(1055, 593), point(656, 388), point(473, 379), point(370, 394), point(345, 304), point(411, 270), point(977, 269), point(1016, 316), point(883, 369), point(766, 569), point(669, 595), point(454, 517), point(342, 581), point(353, 690), point(520, 726)], [point(418, 740), point(349, 674), point(352, 311), point(437, 261), point(528, 275), point(918, 611), point(984, 714), point(1034, 676), point(1036, 332), point(985, 265), point(902, 269), point(561, 611)], [point(429, 432), point(407, 355), point(507, 267), point(613, 339), point(621, 615), point(562, 646), point(506, 618), point(471, 539), point(350, 542), point(321, 631), point(398, 729), point(938, 730), point(1013, 657), point(1020, 302), point(986, 266), point(803, 266), point(753, 303), point(761, 582), point(848, 646), point(925, 550), point(919, 460), point(663, 442)]]
  6. end
  7.  
  8. on e_CreateEnemy theSpriteNum, theCarType, startLoc, state, special, aTimer
  9.   sprite(theSpriteNum).rotation = 270
  10.   theEnemy = [theSpriteNum, theCarType, startLoc, state, special, aTimer, 0, 1, 0.0, 1, 1, [], 0]
  11.   return theEnemy
  12. end
  13.  
  14. on e_AddEnemy theEnemy
  15.   add(geEnemyList, theEnemy)
  16.   myEnemyNum = count(geEnemyList)
  17.   geEnemyList[myEnemyNum][7] = p_RegisterObject([theEnemy[3], point(0, 0), 14, 100.0, theEnemy[1]])
  18.   sprite(geEnemyList[myEnemyNum][1]).member = member(string(geEnemyList[myEnemyNum][2].carType))
  19. end
  20.  
  21. on e_SetStartRotations theRotation
  22.   repeat with n = 1 to count(geEnemyList)
  23.     sprite(geEnemyList[n][1]).rotation = theRotation
  24.   end repeat
  25. end
  26.  
  27. on e_Update theOffset
  28.   repeat with n = 1 to count(geEnemyList)
  29.     case geEnemyList[n][4] of
  30.       #normal:
  31.         e_updateNormal(n)
  32.       #crash:
  33.         e_updateCrash(n)
  34.       #inAir:
  35.         e_updateInAir(n)
  36.     end case
  37.     sprite(geEnemyList[n][1]).loc = geEnemyList[n][3] - theOffset
  38.     if geEnemyList[n][13] = 0 then
  39.       checkPointCheck(n)
  40.     end if
  41.     p_UpdateObject(geEnemyList[n][7], geEnemyList[n][3], point(0, 0))
  42.   end repeat
  43. end
  44.  
  45. on e_updateNormal enemyNum
  46.   theSpriteNum = geEnemyList[enemyNum][1]
  47.   destPoint = geDestPoints[gCurrTrack][geEnemyList[enemyNum][8]]
  48.   e_rotateTowards(theSpriteNum, geEnemyList[enemyNum][3], destPoint, geEnemyList[enemyNum][2].cornering + 4, enemyNum)
  49.   if not geEnemyList[enemyNum][13] then
  50.     geEnemyList[enemyNum][9] = geEnemyList[enemyNum][9] + geEnemyList[enemyNum][2].acceleration
  51.     if geEnemyList[enemyNum][9] > (geEnemyList[enemyNum][2].speed + 1) then
  52.       geEnemyList[enemyNum][9] = geEnemyList[enemyNum][2].speed
  53.     end if
  54.   else
  55.     geEnemyList[enemyNum][9] = geEnemyList[enemyNum][9] * 0.97999999999999998
  56.   end if
  57.   radAngle = sprite(theSpriteNum).rotation * PI / 180
  58.   diff = point(sin(radAngle), -cos(radAngle))
  59.   diff = diff * geEnemyList[enemyNum][9]
  60.   geEnemyList[enemyNum][3] = geEnemyList[enemyNum][3] + diff
  61.   if hitPoint(geEnemyList[enemyNum][3], destPoint, 20) then
  62.     geEnemyList[enemyNum][8] = geEnemyList[enemyNum][8] + 1
  63.     if geEnemyList[enemyNum][8] > count(geDestPoints[gCurrTrack]) then
  64.       geEnemyList[enemyNum][8] = 1
  65.     end if
  66.   end if
  67.   terrainType = t_GroundCheck(geEnemyList[enemyNum][3])
  68.   e_adjustForTerrain(enemyNum, terrainType)
  69. end
  70.  
  71. on e_updateCrash enemyNum
  72.   theSpriteNum = geEnemyList[enemyNum][1]
  73.   destPoint = geDestPoints[gCurrTrack][geEnemyList[enemyNum][8]]
  74.   e_rotateTowards(theSpriteNum, geEnemyList[enemyNum][3], destPoint, geEnemyList[enemyNum][2].cornering, enemyNum)
  75.   geEnemyList[enemyNum][3] = geEnemyList[enemyNum][3] + geEnemyList[enemyNum][5]
  76.   geEnemyList[enemyNum][5] = geEnemyList[enemyNum][5] * 0.94999999999999996
  77.   p_UpdateObject(geEnemyList[enemyNum][7], geEnemyList[enemyNum][3], geEnemyList[enemyNum][5])
  78.   if the ticks > geEnemyList[enemyNum][6] then
  79.     geEnemyList[enemyNum][4] = #normal
  80.   end if
  81. end
  82.  
  83. on e_updateInAir enemyNum
  84.   geEnemyList[enemyNum][9] = geEnemyList[enemyNum][9] + geEnemyList[enemyNum][2].acceleration
  85.   if geEnemyList[enemyNum][9] > geEnemyList[enemyNum][2].speed then
  86.     geEnemyList[enemyNum][9] = geEnemyList[enemyNum][2].speed
  87.   end if
  88.   radAngle = sprite(geEnemyList[enemyNum][1]).rotation * PI / 180
  89.   diff = point(sin(radAngle), -cos(radAngle))
  90.   diff = diff * geEnemyList[enemyNum][9]
  91.   geEnemyList[enemyNum][3] = geEnemyList[enemyNum][3] + diff
  92.   destPoint = geDestPoints[gCurrTrack][geEnemyList[enemyNum][8]]
  93.   if hitPoint(geEnemyList[enemyNum][3], destPoint, 20) then
  94.     geEnemyList[enemyNum][8] = geEnemyList[enemyNum][8] + 1
  95.     if geEnemyList[enemyNum][8] > count(geDestPoints[gCurrTrack]) then
  96.       geEnemyList[enemyNum][8] = 1
  97.     end if
  98.   end if
  99.   sprite(geEnemyList[enemyNum][1]).width = sprite(geEnemyList[enemyNum][1]).width + geEnemyList[enemyNum][5].inAirDimMod
  100.   sprite(geEnemyList[enemyNum][1]).height = sprite(geEnemyList[enemyNum][1]).height + geEnemyList[enemyNum][5].inAirDimMod
  101.   if abs(geEnemyList[enemyNum][5].inAirDimMod) = 2.10000000000000009 then
  102.     maxWidth = 10
  103.   else
  104.     maxWidth = 15
  105.   end if
  106.   if (sprite(geEnemyList[enemyNum][1]).width > (geEnemyList[enemyNum][5].origDims[1] + maxWidth)) and (geEnemyList[enemyNum][5].inAirDimMod > 0) then
  107.     geEnemyList[enemyNum][5].inAirDimMod = -geEnemyList[enemyNum][5].inAirDimMod
  108.   end if
  109.   if sprite(geEnemyList[enemyNum][1]).width <= geEnemyList[enemyNum][5].origDims[1] then
  110.     geEnemyList[enemyNum][4] = #normal
  111.     sprite(geEnemyList[enemyNum][1]).width = geEnemyList[enemyNum][5].origDims[1]
  112.     sprite(geEnemyList[enemyNum][1]).height = geEnemyList[enemyNum][5].origDims[2]
  113.   end if
  114. end
  115.  
  116. on e_Crash theSpriteNum, crashVel
  117.   enemyNum = e_findEnemyFromSpriteNum(theSpriteNum)
  118.   if enemyNum = 0 then
  119.     return 
  120.   end if
  121.   if geEnemyList[enemyNum][4] = #normal then
  122.     geEnemyList[enemyNum][3] = geEnemyList[enemyNum][3] + crashVel
  123.     geEnemyList[enemyNum][4] = #crash
  124.     if p_GetDistance(point(0, 0), crashVel) < 0.5 then
  125.       geEnemyList[enemyNum][4] = #normal
  126.     else
  127.       geEnemyList[enemyNum][5] = crashVel.duplicate()
  128.     end if
  129.     geEnemyList[enemyNum][6] = the ticks + random(12) + 12
  130.   end if
  131. end
  132.  
  133. on e_findEnemyFromSpriteNum theSpriteNum
  134.   repeat with n = 1 to count(geEnemyList)
  135.     if geEnemyList[n][1] = theSpriteNum then
  136.       return n
  137.     end if
  138.   end repeat
  139.   return 0
  140. end
  141.  
  142. on e_rotateTowards theSpriteNum, ourLocation, thePoint, amount, enemyNum
  143.   theAngle = getAngle(ourLocation, thePoint)
  144.   if sprite(theSpriteNum).rotation > (theAngle + 180) then
  145.     sprite(theSpriteNum).rotation = sprite(theSpriteNum).rotation - 360
  146.   end if
  147.   if abs(sprite(theSpriteNum).rotation + 360 - theAngle) < abs(sprite(theSpriteNum).rotation - theAngle) then
  148.     sprite(theSpriteNum).rotation = sprite(theSpriteNum).rotation + 360
  149.   end if
  150.   if (abs(sprite(theSpriteNum).rotation - theAngle) > 40) and (geEnemyList[enemyNum][9] > 3.0) then
  151.     geEnemyList[enemyNum][9] = geEnemyList[enemyNum][9] - 1
  152.   end if
  153.   if sprite(theSpriteNum).rotation < (theAngle - amount) then
  154.     sprite(theSpriteNum).rotation = sprite(theSpriteNum).rotation + amount
  155.   else
  156.     if sprite(theSpriteNum).rotation > (theAngle + amount) then
  157.       sprite(theSpriteNum).rotation = sprite(theSpriteNum).rotation - amount
  158.     end if
  159.   end if
  160. end
  161.  
  162. on e_adjustForTerrain enemyNum, terrainType
  163.   case terrainType of
  164.     #track:
  165.       nothing()
  166.     #grass:
  167.       if geEnemyList[enemyNum][9] > (geEnemyList[enemyNum][2].speed / 2.5) then
  168.         geEnemyList[enemyNum][9] = geEnemyList[enemyNum][2].speed / 2.5
  169.         if geEnemyList[enemyNum][9] > 0.0 then
  170.           gfx_CreateEffect(#smoke, geEnemyList[enemyNum][3], 120, gPlayer.pLocation, 0, geEnemyList[enemyNum][1], 1)
  171.         end if
  172.       end if
  173.     #mediumRamp:
  174.       geEnemyList[enemyNum][4] = #inAir
  175.       geEnemyList[enemyNum][5] = [#inAirDimMod: 2, #origDims: [sprite(geEnemyList[enemyNum][1]).member.width, sprite(geEnemyList[enemyNum][1]).member.height]]
  176.     #bigRamp:
  177.       geEnemyList[enemyNum][4] = #inAir
  178.       geEnemyList[enemyNum][5] = [#inAirDimMod: 1, #origDims: [sprite(geEnemyList[enemyNum][1]).member.width, sprite(geEnemyList[enemyNum][1]).member.height]]
  179.     #inpassible:
  180.     #smallRamp:
  181.       geEnemyList[enemyNum][4] = #inAir
  182.       geEnemyList[enemyNum][5] = [#inAirDimMod: 2.10000000000000009, #origDims: [sprite(geEnemyList[enemyNum][1]).member.width, sprite(geEnemyList[enemyNum][1]).member.height]]
  183.   end case
  184. end
  185.  
  186. on checkPointCheck enemyNum
  187.   pCheckPoints = gPlayer.pCheckPoints[gCurrTrack]
  188.   if hitPoint(geEnemyList[enemyNum][3], pCheckPoints[geEnemyList[enemyNum][10]], 100) then
  189.     geEnemyList[enemyNum][10] = geEnemyList[enemyNum][10] + 1
  190.     if geEnemyList[enemyNum][10] > count(pCheckPoints) then
  191.       geEnemyList[enemyNum][11] = geEnemyList[enemyNum][11] + 1
  192.       add(geEnemyList[enemyNum][12], getTime())
  193.       geEnemyList[enemyNum][10] = 1
  194.       if geEnemyList[enemyNum][11] = 4 then
  195.         geEnemyList[enemyNum][13] = 1
  196.         add(gFinalRankings, geEnemyList[enemyNum][1])
  197.       end if
  198.     end if
  199.   end if
  200. end
  201.